
// Этот плагин выполняет переименование переменных если это возможно.
// При возникновении конфликтов регистрирует ошибку, которая указывает на конфликтную переменную.

// Пример ожидаемой структуры параметров (json):
// {"СтароеИмя1": "НовоеИмя1", "СтароеИмя2": "НовоеИмя2"}

Перем Токены;
Перем Типы;
Перем ТаблицаОшибок;
Перем ТаблицаЗамен;
Перем Директивы;

Перем Результат;
Перем ПрефиксПеременных;
// Перем ОписаниеКонфигурации;
Перем ИменаОбработокДляЗамены;
Перем ИменаОтчетовДляЗамены;
Перем ИменаОбщихФорм;

Процедура Открыть(Парсер, Параметры) Экспорт
	Типы = Парсер.Типы();
	ТаблицаОшибок = Парсер.ТаблицаОшибок();
	ТаблицаЗамен = Парсер.ТаблицаЗамен();
	Директивы = Парсер.Директивы();
	Токены = Парсер.Токены();
	
	Результат = Новый Массив;
	
	ПрефиксПеременных=Параметры.ПрефиксПеременныхИПроцедур;
	ОписаниеКонфигурации=Параметры.ОписаниеКонфигурации;
	
	ИменаОбработокДляЗамены=Новый Массив;
	Для Каждого ТекОбъект ИЗ ОписаниеКонфигурации.Обработки Цикл
		ИменаОбработокДляЗамены.Добавить("обработка."+НРег(ТекОбъект.Имя));
	КонецЦикла;
	ИменаОтчетовДляЗамены=Новый Массив;
	Для Каждого ТекОбъект ИЗ ОписаниеКонфигурации.Отчеты Цикл
		ИменаОтчетовДляЗамены.Добавить("отчет."+НРег(ТекОбъект.Имя));
	КонецЦикла;
	
	ИменаОбщихФорм=Новый Массив;
	Для Каждого ТекОбъект ИЗ ОписаниеКонфигурации.ОбщиеФормы Цикл
		ИменаОбщихФорм.Добавить("общаяформа."+НРег(ТекОбъект.Имя));
	КонецЦикла;
	
КонецПроцедуры // Открыть()

Функция Закрыть() Экспорт
	Возврат СтрСоединить(Результат);
КонецФункции // Закрыть()

Функция Подписки() Экспорт
	Перем Подписки;
	Подписки = Новый Массив;
	Подписки.Добавить("ПосетитьВыражениеЛитерал");
	Возврат Подписки;
КонецФункции // Подписки()

#Область РеализацияПодписок

Процедура ПосетитьВыражениеЛитерал(Описание) Экспорт
	Если Описание.Вид <> Токены["Строка"] Тогда
		Возврат;
	КонецЕсли;
	
	ОткрытиеФормыОбработки=Ложь;
	
	Для Каждого ИмяИнструмента Из ИменаОбработокДляЗамены Цикл
		Если СтрНачинаетсяС(НРег(Описание.Значение), ИмяИнструмента) Тогда
			ОткрытиеФормыОбработки=Истина;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	ОткрытиеФормыОтчета=Ложь;
	
	Для Каждого ИмяИнструмента Из ИменаОтчетовДляЗамены Цикл
		Если СтрНачинаетсяС(НРег(Описание.Значение), ИмяИнструмента) Тогда
			ОткрытиеФормыОтчета=Истина;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	ОткрытиеОбщейФормы=Ложь;
	Для Каждого ИмяФормы Из ИменаОбщихФорм Цикл
		Если СтрНачинаетсяС(НРег(Описание.Значение), ИмяФормы) Тогда
			ОткрытиеОбщейФормы=Истина;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	
	Если НЕ ОткрытиеФормыОбработки
		И Не ОткрытиеОбщейФормы
		И Не ОткрытиеФормыОтчета Тогда
		Возврат;
	КонецЕсли;
	
	МассивИмени = СтрРазделить(Описание.Значение, ".");
	// МассивИмени.Удалить(0);
	МассивИмени.Удалить(0);
	Если ОткрытиеОбщейФормы Тогда
		МассивИмени.Вставить(0,"ВнешняяОбработка.УИ_ПортативныеУниверсальныеИнструменты.Форма");
	ИначеЕсли ОткрытиеФормыОтчета Тогда
		МассивИмени.Вставить(0,"ВнешнийОтчет");
	Иначе
		МассивИмени.Вставить(0,"ВнешняяОбработка");
	КонецЕсли;
	
	Замена(""""+СтрСоединить(МассивИмени,".")+"""", Описание.Начало, Описание.Конец);
КонецПроцедуры

#КонецОбласти // РеализацияПодписок

Процедура Ошибка(Текст, Начало, Конец = Неопределено, ЕстьЗамена = Ложь)
	Ошибка = ТаблицаОшибок.Добавить();
	Ошибка.Источник = "ПереопределитьМетодОбщийМодуль";
	Ошибка.Текст = Текст;
	Ошибка.ПозицияНачала = Начало.Позиция;
	Ошибка.НомерСтрокиНачала = Начало.НомерСтроки;
	Ошибка.НомерКолонкиНачала = Начало.НомерКолонки;
	Если Конец = Неопределено Или Конец = Начало Тогда
		Ошибка.ПозицияКонца = Начало.Позиция + Начало.Длина;
		Ошибка.НомерСтрокиКонца = Начало.НомерСтроки;
		Ошибка.НомерКолонкиКонца = Начало.НомерКолонки + Начало.Длина;
	Иначе
		Ошибка.ПозицияКонца = Конец.Позиция + Конец.Длина;
		Ошибка.НомерСтрокиКонца = Конец.НомерСтроки;
		Ошибка.НомерКолонкиКонца = Конец.НомерКолонки + Конец.Длина;
	КонецЕсли;
	Ошибка.ЕстьЗамена = ЕстьЗамена;
КонецПроцедуры

Процедура Замена(Текст, Начало, Конец = Неопределено)
	НоваяЗамена = ТаблицаЗамен.Добавить();
	НоваяЗамена.Источник = "ПереопределитьМетодОбщийМодуль";
	НоваяЗамена.Текст = Текст;
	НоваяЗамена.Позиция = Начало.Позиция;
	Если Конец = Неопределено Тогда
		НоваяЗамена.Длина = Начало.Длина;
	Иначе
		НоваяЗамена.Длина = Конец.Позиция + Конец.Длина - Начало.Позиция;
	КонецЕсли;
КонецПроцедуры

Процедура Вставка(Текст, Позиция)
	НоваяЗамена = ТаблицаЗамен.Добавить();
	НоваяЗамена.Источник = "ПереопределитьМетодОбщийМодуль";
	НоваяЗамена.Текст = Текст;
	НоваяЗамена.Позиция = Позиция;
	НоваяЗамена.Длина = 0;
КонецПроцедуры